import { ref } from 'vue'

import { initUserInfo } from './user'
import { server } from './config'

// #ifdef MP-WEIXIN
import '@wxobs/miniprogram-helper'
import { miniProgramEnv } from './config'
import { download, fs } from './file-utils'
// #endif

/** APP配置项 */
const appConfig = ref<{
  /** 新用户注册赠送豆数 */
  newUserBean: number
  /** 当前购买会员卡数 */
  memberCard: number
  /** 加微信群送豆数 */
  wxGroupReward: number
}>({
  newUserBean: 0,
  memberCard: 0,
  wxGroupReward: 0,
})

/**
 * APP初始化
 * @param query 启动参数
 */
const appInit = async (query: any) => {
  // 加载字体
  let source = server.srcServer + 'fonts/ChillRoundM.ttf'

  // #ifdef MP
  source = await download(source)

  try {
    source = await new Promise((resolve, reject) => {
      fs
        ? fs.readFile({
            filePath: source,
            encoding: 'base64',
            success: res => resolve(`url("data:font/ttf;charset=utf-8;base64,${res.data}")`),
            fail: reject,
          })
        : reject()
    })
  } catch (err) {
    source = `url(${source})`
  }
  // #endif

  // #ifndef MP
  source = `url(${source})`
  // #endif

  uni.loadFontFace({
    source,
    family: 'ChillRoundM',
    global: true,
    fail: err => console.error(err),
  })

  await initUserInfo(query)

  // #ifdef MP-WEIXIN
  // @ts-ignore
  const obs: any = uni.obs

  miniProgramEnv.isRelease &&
    (await obs.setup({
      maskMode: 'no-mask', // 可选，默认值 'all-mask'，'all-mask'表示采集时默认遮罩所有元素，'no-mask'表示不遮罩。使用 'no-mask' 模式时，请注意遵守《个人隐私保护法》等法规，在用户同意的情况下采集隐私数据。
      // isWhitelistMaskMode: boolean // [已弃用] 可选，默认值 true。true 表示以白名单模式遮罩小程序中的元素，false表以黑名单模式遮罩小程序中的元素。不可和 maskMode 同时使用。
      captureDataAttrs: true, // 可选，默认为 true。采集 webview 中的元素时，是否采集以 data-* 为开头的属性
      // shouldCapturePage?: (page: string, query: Record<string, string>) => boolean // 可选。用于控制是否采集某页面的回调，page 和 query 是该页面的属性，默认为全部采集。
      // shouldCaptureNetwork?: (info: INetworkRequestInfo) => boolean | INetworkRequestInfo // 可选。用于自定义网络请求采集，默认只采集失败的网络的请求的 URL 和状态码。基础库需 >= 3.4.1
      // newSessionCallback?: (param: { sessionId: string }) => void // 产生新的会话时的回调
      autoSplitSession: true, // 是否自动分片
      // onReport?: (param: { timestamp: number; from: 'appservice' | 'webview' }) => void // 上报数据时的回调
      errorCallback: (() => {}) as (param: {
        type: number
        errMsg: string
        extra?: string
      }) => void, // 采集器内部发生错误时的回调
      canvas: false, // 是否采集 canvas. default: false。 基础库 >= 3.2.2
      // canvasCollectInterval?: number // canvas 采集间隔，单位 ms. default: 100
    }))
  // #endif
}

export { appConfig, appInit }
